package com.mixsmart.core.dao;

import java.util.HashMap;
import java.util.List;

import com.mixsmart.core.bean.Paginate;
import com.mixsmart.core.bean.entity.IEntityBean;
import com.mixsmart.spellsql.ICondition;

/**
 * 查询 DAO接口
 * @author lmq
 * @version 1.0
 * @since JDK版本大于等于1.6
 * 2015年12月21日
 */
public interface IQueryDao {

	/**
	 * 根据指定的实体对象按条件查询，并返回唯一值
	 * @param clazz 实体对象
	 * @param condition 查询对象  <br />
	 * 通过{@link com.mixsmart.spellsql.utils.Cnd}.方法名({@link com.mixsmart.spellsql.utils.Exp}.方法名())来设置条件；<br />
	 * 如：Cnd.where(Exp.eq("name","张三"))
	 * @return 返回实体对象
	 */
	public <E> E findUnique(Class<? extends IEntityBean> clazz, ICondition condition);
	
	
	/**
	 * 根据指定的实体对象按条件查询
	 * @param clazz　实体对象
	 * @param condition 查询对象  <br />
	 * 通过{@link com.mixsmart.spellsql.utils.Cnd}.方法名({@link com.mixsmart.spellsql.utils.Exp}.方法名())来设置条件；<br />
	 * 如：Cnd.where(Exp.eq("name","张三"))
	 * @return 返回指定实体对象集合
	 */
	public <E> List<E> finds(Class<? extends IEntityBean> clazz, ICondition condition);
	
	/**
	 * 根据指定的实体对象按条件查询
	 * @param clazz　实体对象
	 * @param condition 查询对象  <br />
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * 通过{@link com.mixsmart.spellsql.utils.Cnd}.方法名({@link com.mixsmart.spellsql.utils.Exp}.方法名())来设置条件；<br />
	 * 如：Cnd.where(Exp.eq("name","张三"))
	 * @return 返回指定实体对象集合
	 */
	public <E> Paginate<E> finds(Class<? extends IEntityBean> clazz, ICondition condition,
			int pageNo, int pageSize);
	
	
	/**
	 * 根据SQL语句查询；查询结果转换为指定的对象
	 * @param sql SQL语句
	 * @param params 参数
	 * @param clazz 结果集要转换的指定对象 <br />
	 * 如：Map.class，则结果转换为Map数据结构
	 * @return 返回指定对象集合
	 */
	public <E> List<E> querySql(String sql, HashMap<String,Object> params, Class<?> clazz);
	
	/**
	 * SQL语句根据提供的参数进行过滤处理后在查询；并查询结果转换为指定的对象
	 * @param sql SQL语句
	 * @param params 参数
	 * @param clazz 结果集要转换的指定对象
	 * @return 返回指定对象集合
	 */
	public <E> List<E> querySqlFilter(String sql, HashMap<String,Object> params, Class<?> clazz);
	
	/**
	 * 根据SQL语句分页查询(转换为指定的对象)
	 * @param sql SQL语句
	 * @param params 参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @param clazz 结果集要转换的指定对象 <br />
	 * 如：Map.class，则结果转换为Map数据结构
	 * @return 返回分页对象
	 */
	public <E> Paginate<E> querySql(String sql, HashMap<String,Object> params,
			int pageNo, int pageSize, Class<?> clazz);
	
	/**
	 * SQL语句按参数过滤后分页查询(转换为指定的对象)
	 * @param sql SQL语句
	 * @param params 参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @param clazz 结果集要转换的指定对象 <br />
	 * 如：Map.class，则结果转换为Map数据结构
	 * @return 返回分页对象
	 */
	public <E> Paginate<E> querySqlFilter(String sql, HashMap<String,Object> params,
			int pageNo, int pageSize, Class<?> clazz);
	
	/**
	 * 根据SQL语句查询(返回对象数组)
	 * @param sql SQL语句
	 * @param params 参数
	 * @return 返回对象集合
	 */
	public List<Object> queryObjSql(String sql, HashMap<String,Object> params);
	
	/**
	 * SQL语句按参数过滤后查询(返回对象数组)
	 * @param sql SQL语句
	 * @param params 参数
	 * @return 返回对象集合
	 */
	public List<Object> queryObjSqlFilter(String sql, HashMap<String,Object> params);
	
	/**
	 * 根据HQL语句查询(返回对象数组)
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 返回对象集合
	 */
	public List<Object> queryObjHql(String hql, HashMap<String,Object> params);
	
	/**
	 * HQL语句按参数过滤后查询(返回对象数组)
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 返回对象集合
	 */
	public List<Object> queryObjHqlFilter(String hql, HashMap<String,Object> params);
	
	/**
	 * 根据SQL语句分页查询(返回对象数组)
	 * @param sql SQL语句
	 * @param params 参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public Paginate<Object> queryObjSql(String sql, HashMap<String,Object> params,
			int pageNo, int pageSize);
	
	/**
	 * SQL语句按参数过滤后分页查询(返回对象数组)
	 * @param sql SQL语句
	 * @param params 参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public Paginate<Object> queryObjSqlFilter(String sql, HashMap<String,Object> params,
			int pageNo, int pageSize);
	
	/**
	 * 根据SQL统计
	 * @param sql SQL语句
	 * @param params 参数
	 * @return 统计结果
	 */
	public Long countSql(String sql, HashMap<String,Object> params);
	
	/**
	 * SQL语句按参数过滤后统计
	 * @param sql SQL语句
	 * @param params 参数
	 * @return 统计结果
	 */
	public Long countSqlFilter(String sql, HashMap<String,Object> params);
	
	/**
	 * 根据HQL统计
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 统计结果
	 */
	public Long countHql(String hql, HashMap<String,Object> params);
	
	/**
	 * 根据HQL统计
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 统计结果
	 */
	public Long countHqlFilter(String hql, HashMap<String,Object> params);
	
	/**
	 * 根据HQL语句分页查询
	 * @param hql HQL语句
	 * @param params 参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public Paginate<Object> queryObjHql(String hql, HashMap<String,Object> params, 
			int pageNo, int pageSize);
	
	/**
	 * HQL语句根据参数过滤后，分页查询
	 * @param hql HQL语句
	 * @param params 参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public Paginate<Object> queryObjHqlFilter(String hql, HashMap<String,Object> params, 
			int pageNo, int pageSize);
}
